import requests
import json
from database import insert_plot, session, Plot
from datetime import datetime
import logging
import os

# 设置日志
if not logging.getLogger().hasHandlers():  # 如果未设置全局日志处理器，单独运行时初始化日志
    os.makedirs("logs", exist_ok=True)  # 确保日志目录存在
    logging.basicConfig(
        level=logging.INFO,  # 设置日志级别
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        handlers=[
            logging.FileHandler('logs/plot_generator.log'),  # 写入到独立日志文件
            logging.StreamHandler()  # 同时输出到控制台
        ]
    )

logger = logging.getLogger(__name__)

# Ollama API URL
OLLAMA_API_URL = "http://localhost:11434/api/generate"


def generate_plot(prompt, previous_chapter_content=None):
    """
    生成新的情节骨架，并基于前一章的情节内容生成新的创想。
    """
    try:
        if previous_chapter_content:
            prompt = f"根据前一章的情节：\n{previous_chapter_content}\n\n" \
                     "生成下一章的情节骨架。情节应该覆盖整个章节的主要事件和转折点，" \
                     "但不要涉及细节描述。仅包含关键情节发展、冲突、人物动机和目标，" \
                     "保持章节之间的连贯性。尽量扩展情节，保证篇幅适中，涵盖从开头到结尾的框架。用中文回答。"

        payload = {
            "prompt": prompt,
            "max_length": 4096,
            "temperature": 0.8,
            "model": "llama3.1:latest",
        }

        response = requests.post(OLLAMA_API_URL, json=payload, stream=True)

        if response.status_code != 200:
            logger.error(f"Ollama API error: {response.text}")
            return None

        generated_plot = ""

        for line in response.iter_lines(decode_unicode=True):
            if line:
                try:
                    response_data = json.loads(line.strip())
                    if 'response' in response_data:
                        generated_plot += response_data['response']
                    if response_data.get('done'):
                        break
                except ValueError as e:
                    logger.error(f"Failed to parse line as JSON: {e}")
                    logger.error(f"Line content: {line}")
                    continue

        if not generated_plot:
            logger.error("Ollama API did not return any plot.")
            return None

        return generated_plot

    except Exception as e:
        logger.error(f"Plot generation failed: {e}")
        return None



def generate_and_store_plot(prompt):
    """
    生成并存储新的情节。
    """
    last_plot = session.query(Plot).order_by(Plot.id.desc()).first()
    previous_chapter_content = last_plot.content if last_plot else None

    generated_plot = generate_plot(prompt, previous_chapter_content)

    if generated_plot:
        insert_plot(f"Chapter {last_plot.id + 1 if last_plot else 1}", generated_plot,
                    previous_chapter_id=last_plot.id if last_plot else None, created_at=datetime.now())
        logger.info(f"Generated and stored plot: {generated_plot}")


if __name__ == "__main__":
    generate_and_store_plot(
        """
        在一个被称为“星海学院”的顶级异能者学校中，隐藏着一场命运交织的爱情游戏。三位性格迥异、能力卓绝的少年，因宿命与羁绊相遇。他们的爱情、友情与对抗在迷雾重重的学院中展开。

主角1：**凌澈**，冷静坚韧的学院领袖，身负“神秘掌控者”的称号，却在感情面前无所适从。他隐藏着一段不可告人的过去，与星海学院的秘密息息相关。

主角2：**季言**，阳光开朗、才华横溢的少年，拥有“幻梦织者”的异能，能看透人心。他对感情坦率执着，但内心深处也埋藏着对现实的不安。他与凌澈之间有着复杂的情感牵绊。

男二：**顾云霁**，外表清冷的冰山美人，是星海学院的“夜幕之子”，拥有操控黑暗力量的异能。表面冷漠，实则内心深情，对凌澈有着深深的感情，但他对季言同样充满敌意。
        """
    )